package org.zjx.service;

import org.zjx.enums.prop.SlotType;
import org.zjx.model.prop.ItemInstance;
import org.zjx.model.prop.ItemSlot;
import org.zjx.model.prop.SlotItem;
import org.zjx.repository.ItemSlotRepository;

import java.util.List;
import java.util.Map;

/**
 * 道具管理服务
 */
public interface ItemManager {
    /**
     * 获取玩家所有道具实例
     */
    List<ItemInstance> getPlayerItems(String playerId);

    /**
     * 获取指定类型的所有槽位定义
     */
    List<ItemSlot> getSlotDefinitions(SlotType slotType);

    /**
     * 获取玩家指定栏中所有道具实例
     */
    List<ItemInstance> getPlayerItemsBySlotType(String playerId, SlotType slotType);

    /**
     * 移动道具到指定槽位
     */
    boolean moveItem(String playerId, int instanceId, int targetSlotId);

    /**
     * 切换栏位中道具
     */
    boolean handOff(String playerId,SlotType slotType1,SlotType SlotType2);

    /**
     * 是否有道具
     */
    List<ItemSlot> findItem(String playerId, int itemTemplateId, Map<String, Object> attributes);

    /**
     * 指定栏位是否需要识别属性
     */
    List<ItemInstance> needGather(String playerId,SlotType slotType);

    /**
     * 更新实例
     */
    boolean updateItem(String playerId,ItemInstance instance);

    /**
     * 批量更新道具实例
     * @param playerId 玩家ID
     * @param instances 要更新的道具实例列表
     * @return 是否全部更新成功
     */
    boolean updateItems(String playerId, List<ItemInstance> instances);

    /**
     * 创建新道具实例
     * @param playerId 玩家ID
     * @param templateId 道具模板ID
     * @param slotId 槽位ID
     * @return 新创建的道具实例
     */
    ItemInstance createItem(String playerId, int templateId, int slotId,int stack);

    /**
     * 删除道具实例
     * @param playerId 玩家ID
     * @param instanceId 道具实例ID
     * @return 是否删除成功
     */
    boolean deleteItem(String playerId, int instanceId);

    /**
     * 批量删除道具实例
     * @param playerId 玩家ID
     * @param instanceIds 道具实例ID列表
     * @return 是否全部删除成功
     */
    boolean deleteItems(String playerId, List<Integer> instanceIds);

    /**
     * 同步槽位道具
     * @param playerId 玩家ID
     * @param slotItems 槽位期望的道具配置(name和stack，按槽位顺序，可为null)
     * @param slotType 槽位类型
     * @return 所有gather=false的实例（包括新创建的）
     */
    List<ItemInstance> syncSlotItems(String playerId, List<SlotItem> slotItems, SlotType slotType);

    ItemSlotRepository getItemSlotRepository();
}